package com.chentf.behavioral.command.code.demo02;

/**
 * 遥控器
 */
public class RemoteController {

    /**
     * 开 按钮的命令数组
     */
    Command[] onCommands;
    Command[] offCommands;

    /**
     * 执行撤销的命令，必须要记住上次执行的命令对应的撤下命令才能撤销
     */
    Command undoCommand;

    /**
     * 构造器，完成对按钮初始化
     */
    public RemoteController() {
        onCommands = new Command[5];
        offCommands = new Command[5];
        // 初始化五组命令，初始化为空命令
        for (int i = 0; i < 5; i++) {
            onCommands[i] = new NoCommand();
            offCommands[i] = new NoCommand();
        }
    }

    /**
     * 给我们的按钮设置你需要的命令
     * @param no 按钮的编号
     * @param onCommand  开的命令
     * @param offCommand 关的命令
     */
    public void setCommand (int no, Command onCommand, Command offCommand){
        onCommands[no] = onCommand;
        offCommands[no] = offCommand;
    }

    /**
     * 按下开按钮
     */
    public void onButtonWasPushed(int no) {
        // 找到你按下的开的按钮，并调用对应方法
        onCommands[no].execute();
        // 记录这次操作，用于撤销
        undoCommand = onCommands[no];
    }

    /**
     * 按下关按钮
     */
    public void offButtonWasPushed(int no) {
        // 找到你按下的关的按钮，并调用对应方法
        offCommands[no].execute();
        // 记录这次操作，用于撤销
        undoCommand = offCommands[no];
    }

    /**
     * 按下撤销按钮
     */
    public void undoButtonWasPushed() {
        undoCommand.undo();
    }
}
